package k2_oop.p7_javaLang.demo02;

import java.util.Arrays;

public class StringExercise {

    /**
     * 有如下格式的字符串name-age-sex-address,解析出姓名,年龄等信息。
     * 例如：张三丰-19-男-哈尔滨市南岗区东方新天地
     */
    public static void exercise1(){
        String str = "张三丰-19-男-哈尔滨市南岗区东方新天地";

        String[] fields = str.split("-");
        System.out.println("姓名："+fields[0]);
        System.out.println("年龄："+fields[1]);
        System.out.println("性别："+fields[2]);
        System.out.println("地址："+fields[3]);
    }

    /**
     * 编写一个方法，判断一个字符串是否是回文
     */
    public static void exercise2(String string){

        StringBuffer sb = new StringBuffer(string);
        sb.reverse();

        if(string.equals(sb.toString())){
            System.out.println("是回文");
        }else{
            System.out.println("不是回文");
        }
    }

    /**
     * 假设字符串类似这样的aba和aab就相等，现在随便给你二组字符串，请编程比较他们看是否相等 例如 "aabbccdd"与"abcdabdc"相等
     */
    public static boolean exercise3(String s1,String s2){

        //如果字符串为空或长度不等，则无需比较
        if(s1==null || s1.equals("") || s2==null || s2.equals("") || s1.length()!=s2.length()){
            return false;
        }

        while(s1.length()>0){
            String firstChar = s1.substring(0,1);
            //两个字符串都按照其中一个字符串的首字符进行替换
            s1 = s1.replace(firstChar,"");
            s2 = s2.replace(firstChar,"");
            //如果替换掉相同的字符后长度不等，字符串不相等
            if(s1.length()!=s2.length()){
                return false;
            }
        }

        return true;

    }

    /**
     * 给你一组字符串如：iu7i8hy4jnb2，让你编程输出里面的数字：
     * @param str
     */
    public static void exercise4(String str){
//        for (int i = 0; i < str.length(); i++) {
//            char c = str.charAt(i);
//            if (Character.isDigit(c)){
//                System.out.print(c);
//            }
//        }

        char[] chars = str.toCharArray();
        for (char aChar : chars) {
            if (Character.isDigit(aChar)) {
                System.out.print(aChar);
            }
        }
    }

    /**
     * 将字符串中指定部分进行反转，“abcdefgeee”;
     * replace(str,start,end)
     */
    public static void exercise5(String str,int start,int end){
        //把原始字符串转成StringBuffer类型
        StringBuffer strOriginal = new StringBuffer(str);
        //截取需要做反转部分的字符串，转成StringBuffer类型
        StringBuffer strReverse = new StringBuffer(str.substring(start,end+1));

        strOriginal.replace(start,end+1,strReverse.reverse().toString());

        System.out.println(strOriginal.toString());

    }

    /**
     * 拟一个trim方法，去除字符串两端的空格
     * 思路：
     * 1，判断字符串第一个位置是否是空格，如果是继续向下判断，直到不是空格为止,结尾处判断空格也是如此。
     * 2，当开始和结尾都判断到不是空格时，就是要获取的字符串
     */
    public static String exercise6(String str){

        //如果字符串是为空，或都是空格，直接返回 “”即可
        if(str==null || str.equals("") || str.replace(" ","").length()==0){
            return "";
        }

        //正常的字符串先转成 StringBuffer 类型
        StringBuffer sb = new StringBuffer(str);

        //去除左侧空格
        while(sb.substring(0,1).equals(" ")){
            sb.replace(0,1,"");
        }

        //去除右侧空格
        while(sb.substring(sb.length()-1).equals(" ")){
            sb.replace(sb.length()-1,sb.length(),"");
        }

        return sb.toString();

    }

    /**
     * 获取一个字符串在另一个字符串中出现的次数
     * 例如,获取"kk"在"abkkcdkkefkkskk"中出现的次数获取一个字符串在另一个字符串中出现的次数
     * @param strOriginal
     * @param strMatch
     */
    public static void exercise7(String strOriginal,String strMatch){

        //把被匹配的内容进行替换
        String remainStr = strOriginal.replace(strMatch,"");

        //用原长度-替换之后的长度 / 被匹配字符串的长度
        System.out.println((strOriginal.length() - remainStr.length()) / strMatch.length());

    }


    /**
     * 已知字符串：“this is a test of java”.
     * 按要求执行以下操作：
     * (1) 统计该字符串中字母s出现的次数
     * (2) 取出子字符串"test"
     * (3) 用多种方式将本字符串复制到一个字符数组Char[] str中.
     * (4) 将字符串中每个单词的第一个字母变成大写， 输出到控制台。
     * (5) 用两种方式实现该字符串的倒叙输出。(用StringBuffer和for循环方式分别实现)
     * (6) 将本字符串转换成一个字符串数组，要求每个数组元素都是一个有意义的额英文单词,并输出到控制台
     */
    public static void exercise8(){

        final String STRFIND = "test";

        String str = "this is a test of java";

        //1.统计该字符串中字母s出现的次数
        System.out.println(str.length() - str.replace("s", "").length());

        //2.取出子字符串"test"
        System.out.println(str.substring(str.indexOf(STRFIND), str.indexOf(STRFIND) + STRFIND.length()));

        //3.1 使用String提供的方法
        char[] chars = str.toCharArray();
        System.out.println(Arrays.toString(chars));

        //3.2 使用字符串遍历的方式添加到数组中
        char[] charByMySelf = new char[str.length()];
        for (int i = 0; i <str.length() ; i++) {
            charByMySelf[i] = str.charAt(i);
        }
        System.out.println(Arrays.toString(charByMySelf));

        //4.将字符串中每个单词的第一个字母变成大写， 输出到控制台。
        String[] words = str.split("\\s+");
        StringBuffer sb = new StringBuffer();
        for (String word : words) {
            sb.append(word.substring(0,1).toUpperCase()+word.substring(1)+" ");
        }
        System.out.println(sb.toString());

        //5.1 使用StringBuffer提供的方法实现
        StringBuffer sbReverse = new StringBuffer(str);
        sbReverse.reverse();
        System.out.println(sbReverse.toString());

        //5.2 使用for形式实现
        for (int i = str.length()-1; i >=0; i--) {
            System.out.print(str.charAt(i));
        }

    }

    /**
     * 如下字符串,01#张三#20-02#李四#30-03#王五#40。。。。。。,解析每个人分数多少
     */
    public static void exercise9(){
        String str = "01#张三#20-02#李四#30-03#王五#40";

        for (String infoEveryStudent : str.split("-")) {
            String[] field = infoEveryStudent.split("#");
            System.out.println("学号："+field[0]);
            System.out.println("姓名："+field[1]);
            System.out.println("年龄："+Integer.parseInt(field[2]));
        }
    }

    /**
     * 若可以从一个源字符串中， 找到一个相符的字符串(忽略大小写)， 则返回第一个字符的索引位置，否则返回-1
     */
    public static void exercise10(String strOriginal,String strMatch){

        System.out.println(strOriginal.toUpperCase().indexOf(strMatch.toUpperCase()));
    }

    /**
     * 字符串右移n位,例如 “hello world” 右移两位后"ldhello wor"
     */
    public static void exercise11(String str,int count){

        System.out.println(str.substring(str.length() - count%str.length()) + str.substring(0, str.length() - count%str.length()));

    }

    /**
     * 定义一个方法，求出字符串中有多少种字符，以及每个字符的个数
     */
    public static void exercise12(String str){

        String firstChar = "";
        String remainStr = "";
        int charCount = 0;
        while(str.length()>0){
            //截取每次剩余字符串的首字符
            firstChar = str.substring(0,1);
            //把首字符替换成空作为剩余字符
            remainStr = str.replace(firstChar,"");
            //原字符串长度-剩余字符串长度为当前字符的数量
            charCount = str.length()-remainStr.length();
            System.out.println(firstChar+":"+charCount);
            //用剩余的字符串覆盖原字符串，进行下一次循环
            str = remainStr;
        }

    }

    /**
     * 获取两个字符串中最大相同子串
     * 例如找到字符串"abcwerthelloyuiodef"和"cvhellobnm"中的最大相同字串 此题，应该从子串的长度考虑。
     * 思路：
     * 1，将短的那个子串按照长度递减的方式获取到。
     * 2，将每获取到的子串去长串中判断是否包含，如果包含，已经找到！
     */
    public static void exercise13(String s1,String s2){
        //保证短的字符串一定是s1
        String tempStr = "";
        if(s1.length()>s2.length()){
            tempStr = s1;
            s1 = s2;
            s2 = tempStr;
        }

        //第一层循环，表示要匹配的子串的长度
        out:for (int i = s1.length(); i >0; i--) {
            for (int j = 0; j < s1.length()-i; j++) {
                tempStr = s1.substring(j,j+i);
                if(s2.contains(tempStr)){
                    System.out.println("最大子串为："+tempStr);
                    break out;
                }
            }
        }
    }
    public static void main(String[] args) {
//        StringExercise.exercise1();
//        StringExercise.exercise2("helleh");
//        System.out.println(StringExercise.exercise3("qqwqewew", "qqqrwwee"));
//        StringExercise.exercise4("iu7i8hy4jnb2");
//        StringExercise.exercise5("abcdefgeee",2,5);
//        System.out.println(StringExercise.exercise6("hello   world    "));
//        StringExercise.exercise7("akkbkkcdkkefkkskk","kk");
//        StringExercise.exercise8();
//        StringExercise.exercise9();
//        StringExercise.exercise10("hello","ol");
//        StringExercise.exercise11("hello",8);
//        StringExercise.exercise12("apple is an apple");
        StringExercise.exercise13("abchellwerthelloyuiodef","cvhellobnm");

    }


}
